gusucode.com > VC++ RingSDK界面库 > VC++ RingSDK界面库/code/libsrc/ringlib/ringdir.cpp

    /**********************************************************************
//
//
//        ##########                          ######  #########   # ######    #
//      #############                      ########### ######### #########  ###
//     ######## # ###  ##                 ############# ##    ## #####  # ####
//     ####  ##    ## ###                 ###     ### # #      #####   #####
//          #     ###  #            #     ##       ##  ##      ##     ###
//         ## ###### ##      ##  ####    ####          #       #     ##
//       #########  ###  ## ### #######   ######      ##      ##    ###
//      ######      ##  ######  ##  ##       ####     #      ##     ####
//     #######     ##   ###### ##  ###          ##   ##     ###    ######
//     #########   ##  ###### ## ######         ### ##    ###      #  #####
//    ##    ###### ####### ### #### ##  ## #######  ########      ##    ####
//    ##      #### ###  #  ### ### ##  ##########   ######       ##      ####
//   ##         ##                ##   #########    ####         #         ##
//               #              ###
//                              ##
//                             ###
//                             ##
//
//
//							RingSDK类库 ringlib.lib
//作者:临风
//
//版本:1.0
//
//声明:本类库可以自由使用而不须对作者作出任何回报,但作者希望能得到
//		  你的鼓励和支持。你可以对类库源码作出修改和改进,但希望你能在
//		  修改的同时给作者一份同样的副本。
//		  本类库不得用于任何商业用途,如确实需要,请与作者联系。
//
//e-mail:ringphone@sina.com
//
//原文件名:file.cpp
//
//说明:文件操作类实现代码
//
**********************************************************************/
#define MAKE_SELF_LIB

#include "ringlib.h"

ringDir::ringDir()
{
	m_handle = NULL;
	memset(m_szDir,0,MAX_PATH*sizeof(TCHAR));
	memset(m_szCurrDir,0,MAX_PATH*sizeof(TCHAR));
}

ringDir::~ringDir()
{
	FindClose();
}

ringDir::ringDir(LPCTSTR szDir)
{
	m_handle = NULL;
	memset(m_szDir,0,MAX_PATH*sizeof(TCHAR));
	memset(m_szCurrDir,0,MAX_PATH*sizeof(TCHAR));

	if(szDir)
		SetDir(szDir);
}

void ringDir::SetDir(LPCTSTR format,...)
{
	va_list ap;
	memset(m_szDir,0,MAX_PATH*sizeof(TCHAR));
	
	if(format)
	{
		va_start(ap, format);
		_vsntprintf((char*)m_szDir,MAX_PATH-2,format,ap);
		//vsprintf((char*)m_szDir,format,ap);
		va_end(ap);
	}
	//去掉最后的"\\";
	TCHAR *lps = m_szDir + lstrlen(m_szDir) - 1;
	while(lps > m_szDir && *lps == '\\')
		*lps-- = '\0';
}

BOOL ringDir::IsExist()
{
	if(*m_szDir != '\0')
	{
		DWORD attr = GetFileAttributes(m_szDir);
		
		if((attr == 0xffffffff) ||
			(attr & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
			return FALSE;
		else
			return TRUE;
	}
	return FALSE;
}

BOOL ringDir::BeginFindFile(LPCTSTR szFilename,LPTSTR lpBuf)
{
	FindClose();

	memset(m_szCurrDir,0,MAX_PATH*sizeof(TCHAR));
	GetCurrentDirectory(MAX_PATH,m_szCurrDir);

	TCHAR szTmp[MAX_PATH];
	if(m_szDir[lstrlen(m_szDir)-1] != '\\')
		wsprintf(szTmp,"%s\\\0",m_szDir);
	else
		wsprintf(szTmp,"%s\0",m_szDir);

	if(IsExist())
	{
		SetCurrentDirectory(szTmp);
		if(szFilename == NULL)
			szFilename = "*.*";
		//wsprintf(szTmp,"%s\\%s\0",m_szDir,szFilename);
		m_handle = FindFirstFile(szFilename,&m_data);
		if(m_handle == INVALID_HANDLE_VALUE)
		{
			m_handle = NULL;
			SetCurrentDirectory(m_szCurrDir);
			return FALSE;
		}
		else if(lpBuf)
			wsprintf(lpBuf,"%s\0",m_data.cFileName);
		return TRUE;
	}
	return FALSE;
}

BOOL ringDir::FindNext(LPTSTR lpBuf)
{
	if(m_handle)
	{
		if(FindNextFile(m_handle,&m_data))
		{
			if(lpBuf)
				wsprintf(lpBuf,"%s\0",m_data.cFileName);
			return TRUE;
		}
	}
	return FALSE;
}

BOOL ringDir::FindClose()
{
	if(m_handle)
	{
		::FindClose(m_handle);
		m_handle = NULL;
	}
	if(*m_szCurrDir != '\0')
	{
		SetCurrentDirectory(m_szCurrDir);
		memset(m_szCurrDir,0,MAX_PATH*sizeof(TCHAR));
	}
	return TRUE;
}

LPCTSTR ringDir::Select(LPCTSTR lpInitDir/*=NULL*/,LPTSTR lpDir/*=NULL*/)
{
	if(lpDir == NULL)
		lpDir = m_szDir;

	BFFCALLBACK lpfn = NULL;
	LPARAM lParam = 0;

	if(lpInitDir && *lpInitDir != '\0')
	{
		//设置初始目录
		lParam = (LPARAM)lpInitDir;
		lpfn = (BFFCALLBACK)SelDirSpecInitProc;
	}
	if(SelectDir(lpDir,LANSTR_SELDIR,BIF_RETURNONLYFSDIRS,lpfn,lParam))
	{
		FindClose();
		return lpDir;
	}
	else
		return NULL;
}

INT CALLBACK SelDirSpecInitProc(HWND hwnd,UINT uMsg,LPARAM lp,LPARAM pData)
{
	if(uMsg == BFFM_INITIALIZED)
      SendMessage(hwnd,BFFM_SETSELECTION,TRUE,pData);

   return 0;
}

//相对移动到指定目录,m_szDir必须已有数据且以驱动器名开头,即"x:"格式
//支持\\和..,同DOS的CD命令
void ringDir::cd(LPCTSTR lpDir)
{
	if(*m_szDir != '\0' && m_szDir[1] == ':')
	{
		TCHAR *lps;
		while(lpDir && *lpDir != '\0')
		{
			if(*lpDir == '\\')
			{
				//退回到根目录
				memset(m_szDir + 2,0,sizeof(TCHAR)*(MAX_PATH-2));
				lpDir ++;
			}
			else if(*lpDir == '.' && lpDir[1] == '.')
			{
				//退回到上一级目录
				lps = m_szDir + lstrlen(m_szDir) - 1;
				switch(*lps)
				{
					case '\\':
						*lps = '\0';
						//don't break;
					case ':':
						lpDir += 2;
						break;
					default:
						lps --;
						while(*lps != '\\' && *lps != ':')
							*lps-- = '\0';
						if(*lps == '\\')
							*lps-- = '\0';
						lpDir += 2;
				}
				if(*lpDir == '.')
					return;			//非法路径,回退结束
				else if(*lpDir == '\\')
					lpDir ++;		//"..\",移动到"..\"后面一个字符,继续循环
			}
			else
			{
				lps = m_szDir + lstrlen(m_szDir);
				*lps++ = '\\';
				memset(lps,0,sizeof(TCHAR)*(MAX_PATH - (lps - m_szDir)));
				lstrcat(m_szDir,lpDir);
				return;
			}
		}
	}
}